/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package beans;

import Utilidades.ExibirMensagens;
import Utilidades.VariaveisEstaticas;
import dao.ManterClienteDAO;
import dao.ManterProdutoDAO;
import dao.ManterVendaDAO;
import dominio.Cliente;
import dominio.Produto;
import dominio.Venda;
import dominio.VendaProduto;
import dominio.VendaProdutoPK;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import negocio.ManterClienteNegocio;
import negocio.ManterProdutoNegocio;
import negocio.ManterVendaNegocio;
import negocio.ManterVendaProdutoNegocio;

/**
 *
 * @author Kelvin Kirk
 */
@ManagedBean
@SessionScoped
public class ManterVendaBean {
private ManterProdutoNegocio produtoNegocio;
    private ManterClienteNegocio manterClienteNegocio;
    private ManterVendaNegocio manterVendaNegocio;
    private ManterVendaProdutoNegocio vendaProdutoNegocio;
    private ManterProdutoDAO produtoDAO;
    private ManterClienteDAO clienteDAO;
    private Produto produto;
    private Cliente cliente;
    private Venda venda;
    private VendaProdutoPK vendaProdutoPK;
    private VendaProduto vendaProduto;
    private List<Produto> listaProduto;
    private List<Cliente> listaClientes;
    private List<VendaProdutoPK> listaVendaProdutoPK;
    private List<VendaProduto> listaVendaProduto;
    private List<Produto> listaProdutoAdicionadas;
    private List<Venda> listaVendas;
    private List<List<VendaProduto>> listaVendasProdutosExibidas;

    private String listaProdutoAdd[][];
    private boolean existeItemAdd;
    private boolean finalizouAdicionar;
    private boolean exibeTabela;
    private String valorCheque;
    private String valorDinheiro;
    private String quantidade;
    private String produtoAdd;
    private String clienteAtual;
    private Date dataVenda;

    public ManterVendaBean() {
        inicializarAtributos();
    }

    private void inicializarAtributos() {
        produtoNegocio = new ManterProdutoNegocio();
        manterClienteNegocio = new ManterClienteNegocio();
        manterVendaNegocio = new ManterVendaNegocio();
        produtoDAO = new ManterProdutoDAO();
        clienteDAO = new ManterClienteDAO();
        vendaProdutoNegocio = new ManterVendaProdutoNegocio();
        listaProduto = new ArrayList<Produto>();
        listaClientes = new ArrayList<Cliente>();
        
        listaProduto = produtoNegocio.findProdutoEntities();
        listaClientes = manterClienteNegocio.findClienteEntities();
        listaProdutoAdicionadas = new ArrayList<Produto>();
        listaVendaProduto = new ArrayList<VendaProduto>();
        listaVendaProdutoPK = new ArrayList<VendaProdutoPK>();
        listaProdutoAdd = new String[listaProduto.size()][3];
        listaVendas = manterVendaNegocio.findVendaEntities();
        listaVendasProdutosExibidas = new ArrayList<List<VendaProduto>>();
        produto = new Produto();
        cliente = new Cliente();
        venda = new Venda();

        valorCheque = "";
        valorDinheiro = "";
        quantidade = "";
        dataVenda = null;
        produtoAdd = "";
        existeItemAdd = false;
        finalizouAdicionar = false;
        exibeTabela = false;

    }

    public void addItemVenda(){
        if(listaProduto == null){
            ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(7), new Integer(1), new Integer(1)});
            return;
        }
        double valorParcialProd;
        produto = produtoDAO.findProduto(produto.getId());
        for (Produto p : listaProdutoAdicionadas){
            if(listaProdutoAdicionadas.contains(p)){
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(5), new Integer(1), new Integer(1)});
            }
        }
        existeItemAdd = true;
        vendaProduto = new VendaProduto();
        vendaProdutoPK = new VendaProdutoPK();
        cliente = clienteDAO.findCliente(cliente.getCodigo());


        listaProdutoAdicionadas.add(produto);
        listaProdutoAdd[listaProdutoAdicionadas.size() - 1][0] = produto.getNome();
        listaProdutoAdd[listaProdutoAdicionadas.size() - 1][1] = quantidade;
        listaProdutoAdd[listaProdutoAdicionadas.size() - 1][2] = String.valueOf(produto.getPreco());




        String prod;
        int quant;
        double preco;
        clienteAtual = cliente.getNome();
        /*for (int i = 0; i < listaProduto.size(); i++){
            prod = listaProdutoAdd[i][0];
            quant = Integer.parseInt(listaProdutoAdd[i][1]);
            preco = Double.parseDouble(listaProdutoAdd[i][2]);
            valorParcialProd = quant * preco;
            produtoAdd = produtoAdd + "Produto: " + prod + "; Quantidade: "
                    + quant + "; Valor Produto: " + valorParcialProd + "\n";
        }*/

        vendaProdutoPK = new VendaProdutoPK();
       // vendaProdutoPK.setQuantidade(Integer.parseInt(quantidade));
        vendaProdutoPK.setCodProduto(produto.getId());
        listaVendaProdutoPK.add(vendaProdutoPK);

        vendaProduto.setProduto(produto);
        listaVendaProduto.add(vendaProduto);

    }

    public void removeItemVenda(){
        produto = produtoDAO.findProduto(produto.getId());
        listaProdutoAdicionadas.remove(produto);
        for (int i = 0; i < listaVendaProdutoPK.size(); i++) {
            if (listaVendaProdutoPK.get(i).getCodProduto() == produto.getId()) {
                listaVendaProdutoPK.remove(i);
            }
            if (listaVendaProduto.get(i).getProduto().getId() == produto.getId()) {
                listaVendaProduto.remove(i);
            }
        }

        String prod;
        int quant;
        double preco;
        produtoAdd = "";
        /*for (int i = 0; i < listaProduto.size(); i++) {
            prod = listaProdutoAdd[i][0];
            quant = Integer.parseInt(listaProdutoAdd[i][1]);
            preco = Double.parseDouble(listaProdutoAdd[i][2]);
            produtoAdd = produtoAdd + prod + " quantidade = "
                    + quant + "\n" + cliente.getNome()
                    + "\n\n";
        }*/
        if (listaProdutoAdicionadas.isEmpty()) {
            existeItemAdd = false;
        }
        quantidade = "";

    }

    public void finalizarAdicionarItens() {
        finalizouAdicionar = true;
    }

    public void adicionarNovosItens() {
        finalizouAdicionar = false;
    }


    public void create() {
        venda.setDataVenda(dataVenda);
        //venda.setValorCheque(Double.parseDouble(valorCheque));
        venda.setValorDinheiro(Double.parseDouble(valorDinheiro));
        venda.setCliente(cliente);
        int resultado = manterVendaNegocio.create(venda);
        switch (resultado) {
            
            case VariaveisEstaticas.ERRO_DUPLICACAO:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(6), new Integer(1), new Integer(0)});
                break;
            case VariaveisEstaticas.ERRO_BD:
                ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(1), new Integer(1), new Integer(1)});
                break;
        }

        venda = new ManterVendaDAO().findVenda(venda.getCodigovenda());

        for (VendaProdutoPK vpk : listaVendaProdutoPK){
            vpk.setCodVenda(venda.getCodigovenda());
            vendaProduto.setVendaProdutoPK(vpk);
            vendaProduto.setVenda(venda);
            int res = vendaProdutoNegocio.create(vendaProduto);
            switch (res) {
                case VariaveisEstaticas.SUCESSO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.INFORMATIVA, "SUCESSO", new Integer[]{new Integer(6), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_DUPLICACAO:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(6), new Integer(1), new Integer(0)});
                    break;
                case VariaveisEstaticas.ERRO_BD:
                    ExibirMensagens.exibirMensagens(VariaveisEstaticas.ERRO, "ERRO", new Integer[]{new Integer(1), new Integer(1), new Integer(1)});
                    break;
            }
        }
        inicializarAtributos();
    }

    public void findVendaEntities(){
        exibeTabela = true;
        listaVendas = manterVendaNegocio.findVendaEntities();

    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public String getClienteAtual() {
        return clienteAtual;
    }

    public void setClienteAtual(String clienteAtual) {
        this.clienteAtual = clienteAtual;
    }

    public ManterClienteDAO getClienteDAO() {
        return clienteDAO;
    }

    public void setClienteDAO(ManterClienteDAO clienteDAO) {
        this.clienteDAO = clienteDAO;
    }

    public Date getDataVenda() {
        return dataVenda;
    }

    public void setDataVenda(Date dataVenda) {
        this.dataVenda = dataVenda;
    }

    public boolean isExibeTabela() {
        return exibeTabela;
    }

    public void setExibeTabela(boolean exibeTabela) {
        this.exibeTabela = exibeTabela;
    }

    public boolean isExisteItemAdd() {
        return existeItemAdd;
    }

    public void setExisteItemAdd(boolean existeItemAdd) {
        this.existeItemAdd = existeItemAdd;
    }

    public boolean isFinalizouAdicionar() {
        return finalizouAdicionar;
    }

    public void setFinalizouAdicionar(boolean finalizouAdicionar) {
        this.finalizouAdicionar = finalizouAdicionar;
    }

    public List<Cliente> getListaClientes() {
        return listaClientes;
    }

    public void setListaClientes(List<Cliente> listaClientes) {
        this.listaClientes = listaClientes;
    }

    public List<Produto> getListaProduto() {
        return listaProduto;
    }

    public void setListaProduto(List<Produto> listaProduto) {
        this.listaProduto = listaProduto;
    }

    public String[][] getListaProdutoAdd() {
        return listaProdutoAdd;
    }

    public void setListaProdutoAdd(String[][] listaProdutoAdd) {
        this.listaProdutoAdd = listaProdutoAdd;
    }

    public List<Produto> getListaProdutoAdicionadas() {
        return listaProdutoAdicionadas;
    }

    public void setListaProdutoAdicionadas(List<Produto> listaProdutoAdicionadas) {
        this.listaProdutoAdicionadas = listaProdutoAdicionadas;
    }

    public List<VendaProduto> getListaVendaProduto() {
        return listaVendaProduto;
    }

    public void setListaVendaProduto(List<VendaProduto> listaVendaProduto) {
        this.listaVendaProduto = listaVendaProduto;
    }

    public List<VendaProdutoPK> getListaVendaProdutoPK() {
        return listaVendaProdutoPK;
    }

    public void setListaVendaProdutoPK(List<VendaProdutoPK> listaVendaProdutoPK) {
        this.listaVendaProdutoPK = listaVendaProdutoPK;
    }

    public List<Venda> getListaVendas() {
        return listaVendas;
    }

    public void setListaVendas(List<Venda> listaVendas) {
        this.listaVendas = listaVendas;
    }

    public List<List<VendaProduto>> getListaVendasProdutosExibidas() {
        return listaVendasProdutosExibidas;
    }

    public void setListaVendasProdutosExibidas(List<List<VendaProduto>> listaVendasProdutosExibidas) {
        this.listaVendasProdutosExibidas = listaVendasProdutosExibidas;
    }

    public ManterClienteNegocio getManterClienteNegocio() {
        return manterClienteNegocio;
    }

    public void setManterClienteNegocio(ManterClienteNegocio manterClienteNegocio) {
        this.manterClienteNegocio = manterClienteNegocio;
    }

    public ManterVendaNegocio getManterVendaNegocio() {
        return manterVendaNegocio;
    }

    public void setManterVendaNegocio(ManterVendaNegocio manterVendaNegocio) {
        this.manterVendaNegocio = manterVendaNegocio;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public String getProdutoAdd() {
        return produtoAdd;
    }

    public void setProdutoAdd(String produtoAdd) {
        this.produtoAdd = produtoAdd;
    }

    public ManterProdutoDAO getProdutoDAO() {
        return produtoDAO;
    }

    public void setProdutoDAO(ManterProdutoDAO produtoDAO) {
        this.produtoDAO = produtoDAO;
    }

    public ManterProdutoNegocio getProdutoNegocio() {
        return produtoNegocio;
    }

    public void setProdutoNegocio(ManterProdutoNegocio produtoNegocio) {
        this.produtoNegocio = produtoNegocio;
    }

    public String getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(String quantidade) {
        this.quantidade = quantidade;
    }

    public String getValorCheque() {
        return valorCheque;
    }

    public void setValorCheque(String valorCheque) {
        this.valorCheque = valorCheque;
    }

    public String getValorDinheiro() {
        return valorDinheiro;
    }

    public void setValorDinheiro(String valorDinheiro) {
        this.valorDinheiro = valorDinheiro;
    }

    public Venda getVenda() {
        return venda;
    }

    public void setVenda(Venda venda) {
        this.venda = venda;
    }

    public VendaProduto getVendaProduto() {
        return vendaProduto;
    }

    public void setVendaProduto(VendaProduto vendaProduto) {
        this.vendaProduto = vendaProduto;
    }

    public ManterVendaProdutoNegocio getVendaProdutoNegocio() {
        return vendaProdutoNegocio;
    }

    public void setVendaProdutoNegocio(ManterVendaProdutoNegocio vendaProdutoNegocio) {
        this.vendaProdutoNegocio = vendaProdutoNegocio;
    }

    public VendaProdutoPK getVendaProdutoPK() {
        return vendaProdutoPK;
    }

    public void setVendaProdutoPK(VendaProdutoPK vendaProdutoPK) {
        this.vendaProdutoPK = vendaProdutoPK;
    }










}